<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
	<title>moving_avg 聚合 | ElasticSearch 7.7 权威指南中文版</title>
	<meta name="keywords" content="ElasticSearch 权威指南中文版, elasticsearch 7, es7, 实时数据分析，实时数据检索" />
    <meta name="description" content="ElasticSearch 权威指南中文版, elasticsearch 7, es7, 实时数据分析，实时数据检索" />
    <!-- Give IE8 a fighting chance -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
	<link rel="stylesheet" type="text/css" href="../static/styles.css" />
	<script>
	var _link = 'search-aggregations-pipeline-movavg-aggregation.html';
    </script>
</head>
<body>
<div class="main-container">
    <section id="content">
        <div class="content-wrapper">
            <section id="guide" lang="zh_cn">
                <div class="container">
                    <div class="row">
                        <div class="col-xs-12 col-sm-8 col-md-8 guide-section">
                            <div style="color:gray; word-break: break-all; font-size:12px;">原英文版地址: <a href="https://www.elastic.co/guide/en/elasticsearch/reference/7.7/search-aggregations-pipeline-movavg-aggregation.html" rel="nofollow" target="_blank">https://www.elastic.co/guide/en/elasticsearch/reference/7.7/search-aggregations-pipeline-movavg-aggregation.html</a>, 原文档版权归 www.elastic.co 所有<br/>本地英文版地址: <a href="../en/search-aggregations-pipeline-movavg-aggregation.html" rel="nofollow" target="_blank">../en/search-aggregations-pipeline-movavg-aggregation.html</a></div>
                        <!-- start body -->
                  <div class="page_header">
<strong>重要</strong>: 此版本不会发布额外的bug修复或文档更新。最新信息请参考 <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html" rel="nofollow">当前版本文档</a>。
</div>
<div id="content">
<div class="breadcrumbs">
<span class="breadcrumb-link"><a href="index.html">Elasticsearch 权威指南 [7.7]</a></span>
»
<span class="breadcrumb-link"><a href="search-aggregations.html">聚合</a></span>
»
<span class="breadcrumb-link"><a href="search-aggregations-pipeline.html">管道聚合</span>
»
<span class="breadcrumb-node">moving_avg 聚合</span>
</div>
<div class="navheader">
<span class="prev">
<a href="search-aggregations-pipeline-percentiles-bucket-aggregation.html">« percentiles_bucket 聚合</a>
</span>
<span class="next">
<a href="search-aggregations-pipeline-movfn-aggregation.html">moving_function 聚合 »</a>
</span>
</div>
<div class="section">
<div class="titlepage"><div><div>
<h2 class="title">
<a id="search-aggregations-pipeline-movavg-aggregation"></a>移动平均(moving_avg)聚合
</h2>
</div></div></div>
<p><span class="Admonishment Admonishment--change">
[<span class="Admonishment-version u-mono u-strikethrough">6.4.0</span>]
<span class="Admonishment-detail">
在6.4.0版本中废弃。

移动平均聚合已被弃用，取而代之的是更通用的<a class="xref" href="search-aggregations-pipeline-movfn-aggregation.html" title="移动函数聚合" rel="nofollow">移动函数(moving function)聚合</a>。

新的移动函数聚合提供了与移动平均聚合相同的功能，但也提供了更多的灵活性。
</span>
</span></p>
<p>
给定一系列有序的数据，移动平均聚合将在数据上滑动一个窗口，并得出该窗口的平均值。

例如，给定数据<code class="literal">[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]</code>，我们可以计算窗口大小为<code class="literal">5</code>的简单移动平均值，如下所示：
</p>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
(1 + 2 + 3 + 4 + 5) / 5  = 3
</li>
<li class="listitem">
(2 + 3 + 4 + 5 + 6) / 5  = 4
</li>
<li class="listitem">
(3 + 4 + 5 + 6 + 7) / 5 = 5
</li>
<li class="listitem">
等等...
</li>
</ul>
</div>
<p>
移动平均是平滑连续数据的一种简单方法。

移动平均通常应用于基于时间的数据，如股票价格或服务器指标。

平滑可用于消除高频波动或随机噪声，这使得低频趋势更容易被可视化，如季节性。 
</p>
<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_syntax_12"></a>语法
</h3>
</div></div></div>
<p>一个单独的<code class="literal">moving_avg</code>看起来像这样：</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">{
    "moving_avg": {
        "buckets_path": "the_sum",
        "model": "holt",
        "window": 5,
        "gap_policy": "insert_zeros",
        "settings": {
            "alpha": 0.8
        }
    }
}</pre>
</div>
<div class="table">
<p class="title"><strong>表 18. <code class="literal">moving_avg</code>参数</strong></p>
<div class="table-contents">
<table border="1" cellpadding="4px" summary="moving_avg Parameters">
<colgroup>
<col class="col_1">
<col class="col_2">
<col class="col_3">
<col class="col_4">
</colgroup>
<tbody>
<tr>
<th align="left" valign="top">参数名称</th>
<th align="left" valign="top">描述</th>
<th align="left" valign="top">是否必需</th>
<th align="left" valign="top">默认值</th>
</tr>
<tr>
<td align="left" valign="top"><p><code class="literal">buckets_path</code></p></td>
<td align="left" valign="top"><p>
感兴趣的度量的路径 (更多详情请参考 <a class="xref" href="search-aggregations-pipeline.html#buckets-path-syntax" title="buckets_path语法" rel="nofollow"><code class="literal">buckets_path</code>语法</a>)
</p></td>
<td align="left" valign="top"><p>必需</p></td>
<td align="left" valign="top"><p></p></td>
</tr>
<tr>
<td align="left" valign="top"><p><code class="literal">model</code></p></td>
<td align="left" valign="top"><p>我们希望使用的移动平均加权模型</p></td>
<td align="left" valign="top"><p>可选</p></td>
<td align="left" valign="top"><p><code class="literal">simple</code></p></td>
</tr>
<tr>
<td align="left" valign="top"><p><code class="literal">gap_policy</code></p></td>
<td align="left" valign="top"><p>
确定当遇到数据中的间隙时应该发生什么
</p></td>
<td align="left" valign="top"><p>可选</p></td>
<td align="left" valign="top"><p><code class="literal">insert_zeros</code></p></td>
</tr>
<tr>
<td align="left" valign="top"><p><code class="literal">window</code></p></td>
<td align="left" valign="top"><p>在直方图上“滑动”的窗口大小</p></td>
<td align="left" valign="top"><p>可选</p></td>
<td align="left" valign="top"><p><code class="literal">5</code></p></td>
</tr>
<tr>
<td align="left" valign="top"><p><code class="literal">minimize</code></p></td>
<td align="left" valign="top"><p>
模型是否应该在算法上最小化。更多细节请参考<a class="xref" href="search-aggregations-pipeline-movavg-aggregation.html#movavg-minimizer" title="Minimization">最小化</a>
</p></td>
<td align="left" valign="top"><p>可选</p></td>
<td align="left" valign="top"><p>大多数模型用<code class="literal">false</code></p></td>
</tr>
<tr>
<td align="left" valign="top"><p><code class="literal">settings</code></p></td>
<td align="left" valign="top"><p>特定于模型的设置，内容根据指定的模型而有所不同。</p></td>
<td align="left" valign="top"><p>可选</p></td>
<td align="left" valign="top"><p></p></td>
</tr>
</tbody>
</table>
</div>
</div>
<p>
<code class="literal">moving_avg</code>聚合必须嵌入一个<code class="literal">histogram</code>或<code class="literal">date_histogram</code>聚合中。

它们可以像任意其他度量聚合一样嵌入：
</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">POST /_search
{
    "size": 0,
    "aggs": {
        "my_date_histo":{                <a id="CO272-1"></a><i class="conum" data-value="1"></i>
            "date_histogram":{
                "field":"date",
                "calendar_interval":"1M"
            },
            "aggs":{
                "the_sum":{
                    "sum":{ "field": "price" } <a id="CO272-2"></a><i class="conum" data-value="2"></i>
                },
                "the_movavg":{
                    "moving_avg":{ "buckets_path": "the_sum" } <a id="CO272-3"></a><i class="conum" data-value="3"></i>
                }
            }
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/564.console"></div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO272-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>
名为“my_date_histo”的 <code class="literal">date_histogram</code>是在“timestamp”字段上构建的，间隔为一天
</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO272-2"><i class="conum" data-value="2"></i></a></p>
</td>
<td align="left" valign="top">
<p>
<code class="literal">sum</code>度量用于计算字段的总和。

这可以是任何度量(sum、min、max等)
</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO272-3"><i class="conum" data-value="3"></i></a></p>
</td>
<td align="left" valign="top">
<p>
最后，我们指定一个<code class="literal">moving_avg</code>聚合，它使用“the_sum”度量作为其输入。
</p>
</td>
</tr>
</table>
</div>
<p>
移动平均的构建，首先要指定一个字段的<code class="literal">histogram</code>或<code class="literal">date_histogram</code>。

然后，你可以选择在直方图中添加一个常用的度量，比如<code class="literal">sum</code>。

最后，<code class="literal">moving_avg</code> 被嵌入直方图中。

然后，<code class="literal">buckets_path</code>参数用于“指向”直方图内的一个同级指标(有关<code class="literal">buckets_path</code>语法的描述，请参见<a class="xref" href="search-aggregations-pipeline.html#buckets-path-syntax" title="buckets_path语法"><code class="literal">buckets_path</code>语法</a>)。
</p>
<p>来自上述聚合的示例响应可能如下所示：</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">{
   "took": 11,
   "timed_out": false,
   "_shards": ...,
   "hits": ...,
   "aggregations": {
      "my_date_histo": {
         "buckets": [
             {
                 "key_as_string": "2015/01/01 00:00:00",
                 "key": 1420070400000,
                 "doc_count": 3,
                 "the_sum": {
                    "value": 550.0
                 }
             },
             {
                 "key_as_string": "2015/02/01 00:00:00",
                 "key": 1422748800000,
                 "doc_count": 2,
                 "the_sum": {
                    "value": 60.0
                 },
                 "the_movavg": {
                    "value": 550.0
                 }
             },
             {
                 "key_as_string": "2015/03/01 00:00:00",
                 "key": 1425168000000,
                 "doc_count": 2,
                 "the_sum": {
                    "value": 375.0
                 },
                 "the_movavg": {
                    "value": 305.0
                 }
             }
         ]
      }
   }
}</pre>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_models"></a>模型
</h3>
</div></div></div>
<p>
<code class="literal">moving_avg</code>聚合包括四种不同的移动平均“模型”。

主要区别在于窗口中的值是如何加权的。

随着窗口中的数据点变得“更老”，它们的权重可能会有所不同。 

这将影响该窗口的最终平均值。
</p>
<p>
模型使用参数<code class="literal">model</code>来指定。

某些模型可能有可选配置，这些配置在其参数<code class="literal">settings</code>中指定。
</p>
<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="_simple"></a>simple (简单模型)
</h4>
</div></div></div>
<p>
<code class="literal">simple</code>模型计算窗口中所有值的总和，然后除以窗口的大小。

它实际上是窗口的简单算术平均值。

<code class="literal">simple</code>模型不执行任何时间相关的加权，这意味着<code class="literal">simple</code>移动平均值的值往往会“滞后”於真实数据。
</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">POST /_search
{
    "size": 0,
    "aggs": {
        "my_date_histo":{
            "date_histogram":{
                "field":"date",
                "calendar_interval":"1M"
            },
            "aggs":{
                "the_sum":{
                    "sum":{ "field": "price" }
                },
                "the_movavg":{
                    "moving_avg":{
                        "buckets_path": "the_sum",
                        "window" : 30,
                        "model" : "simple"
                    }
                }
            }
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/565.console"></div>
<p>
<code class="literal">simple</code>模型没有需要配置的特殊设置。
</p>
<p>
窗口大小可以改变移动平均线的行为。

例如，一个小窗口(比如<code class="literal">"window": 10</code>)将密切跟踪数据，只平滑小范围的波动：
</p>
<div id="movavg_10window" class="imageblock">
<div class="content">
<img src="../static/images/pipeline_movavg/movavg_10window.png" alt="movavg 10window">
</div>
<div class="title">图 3. 窗口大小为10的移动平均线</div>
</div>
<p>
相反，一个有更大窗口(比如<code class="literal">"window": 100</code>)的<code class="literal">simple</code>移动平均线，它会消除所有高频的波动，只留下低频的长期趋势。

它还会“滞后”实际数据一大截：
</p>
<div id="movavg_100window" class="imageblock">
<div class="content">
<img src="../static/images/pipeline_movavg/movavg_100window.png" alt="movavg 100window">
</div>
<div class="title">图 4. 窗口大小为100的移动平均线</div>
</div>
</div>

</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_linear"></a>linear (线性模型)
</h3>
</div></div></div>
<p>
<code class="literal">linear</code>模型给序列中的点分配一个线性加权，
这样“较老”的数据点(例如，窗口开始的那些)对总平均值的贡献线性减少。 

线性加权有助于减少数据均值的“滞后”，因为较老的点的影响较小。
</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">POST /_search
{
    "size": 0,
    "aggs": {
        "my_date_histo":{
            "date_histogram":{
                "field":"date",
                "calendar_interval":"1M"
            },
            "aggs":{
                "the_sum":{
                    "sum":{ "field": "price" }
                },
                "the_movavg": {
                    "moving_avg":{
                        "buckets_path": "the_sum",
                        "window" : 30,
                        "model" : "linear"
                    }
                }
            }
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/566.console"></div>
<p>
<code class="literal">linear</code>模型没有需要配置的特殊设置。
</p>
<p>
像<code class="literal">simple</code>模型一样，窗口大小可以改变移动平均线的行为。

例如，一个小窗口(比如<code class="literal">"window": 10</code>)将密切跟踪数据，只平滑小范围的波动：
</p>
<div id="linear_10window" class="imageblock">
<div class="content">
<img src="../static/images/pipeline_movavg/linear_10window.png" alt="linear 10window">
</div>
<div class="title">图 5. 窗口大小为10的线性移动平均线</div>
</div>
<p>
相比之下，具有较大窗口(比如<code class="literal">"window": 100</code>)的<code class="literal">linear</code>移动平均线将消除所有高频波动，只留下低频的长期趋势。

它还还是倾向于“滞后”实际数据一个相当大的量，尽管通常比<code class="literal">simple</code>模型要少：
</p>
<div id="linear_100window" class="imageblock">
<div class="content">
<img src="../static/images/pipeline_movavg/linear_100window.png" alt="linear 100window">
</div>
<div class="title">图 6. 窗口大小为10的线性移动平均线</div>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_ewma_exponentially_weighted"></a>ewma (指数加权，exponentially weighted)
</h3>
</div></div></div>
<p>
<code class="literal">ewma</code>模型(又名“单指数”)类似于<code class="literal">linear</code>模型，不同的是，旧的数据点的重要性是以指数级降低，而不是线性降低。

重要性衰减的速度可以通过设置<code class="literal">alpha</code>来控制。

较小的值使权重缓慢衰减，这提供了更大的平滑度，并考虑了窗口的更大部分。

较大的值会使权重迅速衰减，从而降低较旧值对移动平均线的影响。

这往往会使移动平均线更密切地跟踪数据，但却不太平滑。
</p>
<p>
<code class="literal">alpha</code>的默认值为<code class="literal">0.3</code>，该设置接受0-1之间的任何浮点数。
</p>
<p>
EWMA模型可以<a class="xref" href="search-aggregations-pipeline-movavg-aggregation.html#movavg-minimizer" title="最小化">最小化</a>
</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">POST /_search
{
    "size": 0,
    "aggs": {
        "my_date_histo":{
            "date_histogram":{
                "field":"date",
                "calendar_interval":"1M"
            },
            "aggs":{
                "the_sum":{
                    "sum":{ "field": "price" }
                },
                "the_movavg": {
                    "moving_avg":{
                        "buckets_path": "the_sum",
                        "window" : 30,
                        "model" : "ewma",
                        "settings" : {
                            "alpha" : 0.5
                        }
                    }
                }
            }
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/567.console"></div>
<div id="single_0.2alpha" class="imageblock">
<div class="content">
<img src="../static/images/pipeline_movavg/single_0.2alpha.png" alt="single 0.2alpha">
</div>
<div class="title">图 7. 窗口大小为10, alpha = 0.2的指数加权移动平均线 </div>
</div>
<div id="single_0.7alpha" class="imageblock">
<div class="content">
<img src="../static/images/pipeline_movavg/single_0.7alpha.png" alt="single 0.7alpha">
</div>
<div class="title">图 8. 窗口大小为10, alpha = 0.7的指数加权移动平均线</div>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_holt_linear"></a>holt-linear (霍尔特线性模型)
</h3>
</div></div></div>
<p>
<code class="literal">holt</code>模型(亦称作“二次指数”)结合了跟踪数据趋势的第二个指数项。

当数据具有潜在的线性趋势时，单指数表现不佳。

二次指数模型在内部计算两个值：“水平(level)”和“趋势(trend)”。
</p>
<p>
水平(level)计算类似于<code class="literal">ewma</code>，是数据的指数加权视图。

不同之处在于，使用了之前平滑的值，而不是原始值，这使其接近原始序列。

趋势(trend)计算着眼于当前值和上一个值之间的差异(例如，平滑数据的斜率或趋势)。

趋势值也是指数加权的。
</p>
<p>
数值是由水平(level)分量和趋势(trend)分量相乘产生的。
</p>
<p>
<code class="literal">alpha</code>的默认值为<code class="literal">0.3</code>，<code class="literal">beta</code>的默认值为<code class="literal">0.1</code>。

该设置接受0-1之间的任意浮点数。
</p>
<p>
holt-linear 模型可以<a class="xref" href="search-aggregations-pipeline-movavg-aggregation.html#movavg-minimizer" title="最小化">最小化</a>
</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">POST /_search
{
    "size": 0,
    "aggs": {
        "my_date_histo":{
            "date_histogram":{
                "field":"date",
                "calendar_interval":"1M"
            },
            "aggs":{
                "the_sum":{
                    "sum":{ "field": "price" }
                },
                "the_movavg": {
                    "moving_avg":{
                        "buckets_path": "the_sum",
                        "window" : 30,
                        "model" : "holt",
                        "settings" : {
                            "alpha" : 0.5,
                            "beta" : 0.5
                        }
                    }
                }
            }
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/568.console"></div>
<p>
实际上，<code class="literal">alpha</code>值在<code class="literal">holt</code>模型中的表现与在<code class="literal">ewma</code>模型中非常相似：小值产生更多平滑和更多滞后，而大值产生更密切的跟踪和更少的滞后。

<code class="literal">beta</code>的值往往很难看出。

较小的值强调长期趋势(例如整个系列中的恒定线性趋势)，而较大的值强调短期趋势。

当你预测价值时，这一点会变得更加明显。
</p>
<div id="double_0.2beta" class="imageblock">
<div class="content">
<img src="../static/images/pipeline_movavg/double_0.2beta.png" alt="double 0.2beta">
</div>
<div class="title">图 9. Holt-Linear 移动平均线(窗口大小为100, alpha = 0.5, beta = 0.2)</div>
</div>
<div id="double_0.7beta" class="imageblock">
<div class="content">
<img src="../static/images/pipeline_movavg/double_0.7beta.png" alt="double 0.7beta">
</div>
<div class="title">图 10. Holt-Linear 移动平均线(窗口大小为100, alpha = 0.5, beta = 0.7</div>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_holt_winters"></a>holt-winters (霍尔特-温特模型)
</h3>
</div></div></div>
<p>
<code class="literal">holt_winters</code>模型(又名“三级指数”)包含第三个指数项，用于跟踪数据的季节性。

因此，这种聚合基于三个要素进行平滑：“水平(level)”、“趋势(trend)”和“季节性(seasonality)”。
</p>
<p>
水平(level)和趋势(trend)计算与<code class="literal">holt</code>里的相同。

季节性(seasonal)计算着眼于当前点与前一时段点之间的差异。
</p>
<p>
与其他移动平均线相比，holt-winters 需要更多的操作。 

你需要指定数据的“周期(periodicity)”：例如，如果你的数据每7天有一个循环趋势，可以设置<code class="literal">period: 7</code>。

类似地，如果有月趋势，你可以把它设置为<code class="literal">30</code>。

目前没有周期性检测，尽管计划在未来进行增强。
</p>
<p>
holt-winters 有两种类型: <code class="literal">additive</code>(加法)和<code class="literal">multiplicative</code>(乘法)。
</p>
<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="_cold_start"></a>"cold start" (冷启动类型)
</h4>
</div></div></div>
<p>
不幸的是，由于 holt-winters 的性质，它需要两个周期(period)的数据来“引导”该算法。

这意味着你的<code class="literal">window</code>值必须<span class="strong strong"><strong>至少</strong></span>是周期(period)的两倍。

如果不是，将会抛出异常。

这也意味着holt-winters不会为第一个<code class="literal">2 * period</code>桶生成值；当前算法不进行回溯。
</p>
<div id="holt_winters_cold_start" class="imageblock">
<div class="content">
<img src="../static/images/pipeline_movavg/triple_untruncated.png" alt="triple untruncated">
</div>
<div class="title">图 11. Holt-Winters 显示了一个“冷”开始，没有数值</div>
</div>
<p>
因为“冷启动”掩盖了移动平均线的样子，所以Holt-Winters图像的其余部分被截断以不显示“冷启动”。

请注意，这将永远出现在移动平均线的起点！
</p>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="_additive_holt_winters"></a>additive holt-winters (加法霍尔特-温特斯类型)
</h4>
</div></div></div>
<p>
加法季节性是默认的；也可以通过设置<code class="literal">"type": "add"</code>来指定。

当季节性影响添加到数据中时，这种变化是首选的。

例如，你可以简单地减去季节性影响，将你的数据“去季节性化”成一个平坦的趋势。
</p>
<p>
<code class="literal">alpha</code>和<code class="literal">gamma</code>的默认值是<code class="literal">0.3</code>，而<code class="literal">beta</code>是<code class="literal">0.1</code>。

这些设置接受0-1之间的任意浮点数。

<code class="literal">period</code>的默认值是<code class="literal">1</code>。
</p>
<p>
additive holt-winters 模型可以<a class="xref" href="search-aggregations-pipeline-movavg-aggregation.html#movavg-minimizer" title="最小化">最小化</a>
</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">POST /_search
{
    "size": 0,
    "aggs": {
        "my_date_histo":{
            "date_histogram":{
                "field":"date",
                "calendar_interval":"1M"
            },
            "aggs":{
                "the_sum":{
                    "sum":{ "field": "price" }
                },
                "the_movavg": {
                    "moving_avg":{
                        "buckets_path": "the_sum",
                        "window" : 30,
                        "model" : "holt_winters",
                        "settings" : {
                            "type" : "add",
                            "alpha" : 0.5,
                            "beta" : 0.5,
                            "gamma" : 0.5,
                            "period" : 7
                        }
                    }
                }
            }
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/569.console"></div>
<div id="holt_winters_add" class="imageblock">
<div class="content">
<img src="../static/images/pipeline_movavg/triple.png" alt="triple">
</div>
<div class="title">
图 12. Holt-Winters 移动平均线(窗口大小为120, alpha = 0.5, beta = 0.7, gamma = 0.3, period = 30)
</div>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="_multiplicative_holt_winters"></a>multiplicative holt-winters (乘法霍尔特-温特斯类型)
</h4>
</div></div></div>
<p>
乘法通过设置<code class="literal">"type": "mult"</code>来指定。

当季节性影响与数据相乘时，这种变化是首选。

例如，如果季节性影响是数据的5倍，而不是简单地增加它。
</p>
<p>
<code class="literal">alpha</code>和<code class="literal">gamma</code>的默认值是<code class="literal">0.3</code>，而<code class="literal">beta</code>是<code class="literal">0.1</code>。

这些设置接受0-1之间的任意浮点数。

<code class="literal">period</code>的默认值是<code class="literal">1</code>。
</p>
<p>
multiplicative holt-winters 模型可以<a class="xref" href="search-aggregations-pipeline-movavg-aggregation.html#movavg-minimizer" title="最小化">最小化</a>
</p>
<div class="warning admon">
<div class="icon"></div>
<div class="admon_content">
<p>
乘法霍尔特-温特斯的工作原理是将每个数据点除以季节值。

如果任何数据为零，或者数据中有间隙(因为这会导致除以零)，那么这就有问题了。

为了解决这个问题，<code class="literal">mult</code> Holt-Winters用一个非常小的量(1*10<sup>-10</sup>)填充所有的值，这样所有的值都是非零的。

这会影响结果，但影响很小。

如果你的数据是非零的，或者你希望在遇到零时看到<code class="literal">NaN</code>，则可以使用<code class="literal">pad: false</code>禁用此行为
</p>
</div>
</div>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">POST /_search
{
    "size": 0,
    "aggs": {
        "my_date_histo":{
            "date_histogram":{
                "field":"date",
                "calendar_interval":"1M"
            },
            "aggs":{
                "the_sum":{
                    "sum":{ "field": "price" }
                },
                "the_movavg": {
                    "moving_avg":{
                        "buckets_path": "the_sum",
                        "window" : 30,
                        "model" : "holt_winters",
                        "settings" : {
                            "type" : "mult",
                            "alpha" : 0.5,
                            "beta" : 0.5,
                            "gamma" : 0.5,
                            "period" : 7,
                            "pad" : true
                        }
                    }
                }
            }
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/570.console"></div>
</div>

</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_prediction"></a>prediction (预测模式)
</h3>
</div></div></div>
<div class="warning admon">
<div class="icon"></div>
<div class="admon_content">
<p>
此功能是试验性的，在未来的版本中可能会被更改或完全删除。

Elastic将尽最大努力解决任何问题，但实验功能不受官方GA功能的支持SLA的约束。
</p>
</div>
</div>
<p>
所有移动平均模型都支持“prediction(预测)”模式，该模式将尝试在给定当前平滑移动平均的情况下推断未来。

根据模型和参数的不同，这些预测可能准确，也可能不准确。
</p>
<p>
通过向任何移动平均聚合添加一个<code class="literal">predict</code>参数，指定要追加到序列末尾的预测数，可以启用预测。

这些预测将按照与桶相同的间隔排列：
</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">POST /_search
{
    "size": 0,
    "aggs": {
        "my_date_histo":{
            "date_histogram":{
                "field":"date",
                "calendar_interval":"1M"
            },
            "aggs":{
                "the_sum":{
                    "sum":{ "field": "price" }
                },
                "the_movavg": {
                    "moving_avg":{
                        "buckets_path": "the_sum",
                        "window" : 30,
                        "model" : "simple",
                        "predict" : 10
                    }
                }
            }
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/571.console"></div>
<p>
<code class="literal">simple</code>、<code class="literal">linear</code>和<code class="literal">ewma</code>模型都产生“扁平的”预测：它们基本上收敛于序列中最后一个值的平均值，产生平坦的预测：
</p>
<div id="simple_prediction" class="imageblock">
<div class="content">
<img src="../static/images/pipeline_movavg/simple_prediction.png" alt="simple prediction">
</div>
<div class="title">图 13. simple 移动平均线(窗口大小为10, predict = 50)</div>
</div>
<p>
相比之下，<code class="literal">holt</code>模型可以根据局部或全局的恒定趋势进行推断。

如果我们设置一个较高的<code class="literal">beta</code>值，则可以根据局部的恒定趋势进行推断(在这种情况下，预测是向下的，因为系列末尾的数据是向下的):
</p>
<div id="double_prediction_local" class="imageblock">
<div class="content">
<img src="../static/images/pipeline_movavg/double_prediction_local.png" alt="double prediction local">
</div>
<div class="title">图 14. holt-linear 移动平均线(窗口大小100, predict = 20, alpha = 0.5, beta = 0.8)</div>
</div>
<p>
相比之下，如果我们选择一个小的<code class="literal">beta</code>值，预测是基于全局不变的趋势。

在这一系列中，全局趋势略显积极，因此预测做了一个急转弯，开始了一个正斜率：
</p>
<div id="double_prediction_global" class="imageblock">
<div class="content">
<img src="../static/images/pipeline_movavg/double_prediction_global.png" alt="double prediction global">
</div>
<div class="title">图 15. 二级指数 移动平均线(窗口大小100, predict = 20, alpha = 0.5, beta = 0.1)</div>
</div>
<p>
<code class="literal">holt_winters</code>模型具有提供最佳预测的潜力，因为它还将季节性波动纳入了模型：
</p>
<div id="holt_winters_prediction_global" class="imageblock">
<div class="content">
<img src="../static/images/pipeline_movavg/triple_prediction.png" alt="triple prediction">
</div>
<div class="title">图 16. Holt-Winters 移动平均线(窗口大小 120, predict = 25, alpha = 0.8, beta = 0.2, gamma = 0.7, period = 30)</div>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="movavg-minimizer"></a>最小化
</h3>
</div></div></div>
<p>
一些模型(EWMA, Holt-Linear, Holt-Winters)需要配置一个或多个参数。

参数选择可能很棘手，有时不直观。

此外，这些参数的微小偏差有时会对输出的移动平均值产生巨大影响。
</p>
<p>
出于这个原因，这三个“可调”模型可以在算法上<span class="strong strong"><strong>最小化</strong></span>。

最小化是一个调整参数的过程，直到模型生成的预测与输出数据高度匹配。

最小化并不是完全可靠的，而且容易受到过度拟合的影响，但它通常会比手动调优提供更好的结果。
</p>
<p>
<code class="literal">ewma</code>和<code class="literal">holt_linear</code>模型默认禁用了最小化，而<code class="literal">holt_winters</code>模型则默认启用了最小化。

最小化对<code class="literal">holt_winters</code>最有用，因为它有助于提高预测的准确性。

<code class="literal">ewma</code>和<code class="literal">holt_linear</code>主要用于平滑数据，但不是很好的预测工具，因此最小化在这两个模型上用处不大。
</p>
<p>
通过<code class="literal">minimize</code>参数启用/禁用最小化：
</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">POST /_search
{
    "size": 0,
    "aggs": {
        "my_date_histo":{
            "date_histogram":{
                "field":"date",
                "calendar_interval":"1M"
            },
            "aggs":{
                "the_sum":{
                    "sum":{ "field": "price" }
                },
                "the_movavg": {
                    "moving_avg":{
                        "buckets_path": "the_sum",
                        "model" : "holt_winters",
                        "window" : 30,
                        "minimize" : true,  <a id="CO273-1"></a><i class="conum" data-value="1"></i>
                        "settings" : {
                            "period" : 7
                        }
                    }
                }
            }
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/572.console"></div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO273-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>通过参数<code class="literal">minimize</code>启用了最小化</p>
</td>
</tr>
</table>
</div>
<p>
启用时，最小化将找到<code class="literal">alpha</code>、<code class="literal">beta</code>和<code class="literal">gamma</code>的最佳值。

用户仍然应该为<code class="literal">window</code>、<code class="literal">period</code>和<code class="literal">type</code>提供适当的值。
</p>
<div class="warning admon">
<div class="icon"></div>
<div class="admon_content">
<p>
最小化的工作原理是运行一个叫做<span class="strong strong"><strong>simulated annealing（模拟退火）</strong></span>的随机过程。

这个过程通常会产生一个好的解决方案，但不能保证找到全局最优解。

它还需要一些额外的计算能力，因为随着值的调整，模型需要重新运行多次。

最小化的运行时间与窗口大小成线性关系：过大的窗口可能会导致延迟。
</p>
<p>
最后，最小化将模型拟合到最后<code class="literal">n</code>个值，其中<code class="literal">n = window</code>。

这通常会对未来产生更好的预测，因为参数是在系列结束时调整的。

但是，它可能会在系列开始时生成较差的拟合移动平均线。
</p>
</div>
</div>
</div>

</div>
<div class="navfooter">
<span class="prev">
<a href="search-aggregations-pipeline-percentiles-bucket-aggregation.html">« percentiles_bucket 聚合</a>
</span>
<span class="next">
<a href="search-aggregations-pipeline-movfn-aggregation.html">moving_function 聚合 »</a>
</span>
</div>
</div>

                  <!-- end body -->
                        </div>
                        <div class="col-xs-12 col-sm-4 col-md-4" id="right_col">
                        
                        </div>
                    </div>
                </div>
            </section>
        </div>
    </section>
</div>
<script src="../static/cn.js"></script>
</body>
</html>